treeview: Add back the Gdk pointer grab during column dragging
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 9 Jul 2014 14:20:01 +0000 (16:20 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 10 Jul 2014 01:28:46 +0000 (21:28 -0400)
The reparenting happening on the column header so it gets a movable
window breaks the implicit grab, so this is one situation were we
want a pointer grab, if just to replace it.

https://bugzilla.gnome.org/show_bug.cgi?id=732933

gtk/gtktreeview.c

index 7a64921f038cd67b6b7be1761f7e391a49f6bea5..adc45614252d87cbc53aa573271e2b3033d3b9aa 100644 (file)
@@ -3533,7 +3533,11 @@ gtk_tree_view_column_drag_gesture_end (GtkGestureDrag *gesture,
     tree_view->priv->cur_reorder = NULL;
 
   if (tree_view->priv->in_column_drag)
-    gtk_tree_view_button_release_drag_column (tree_view);
+    {
+      gtk_tree_view_button_release_drag_column (tree_view);
+      gdk_device_ungrab (gtk_gesture_get_device (GTK_GESTURE (gesture)),
+                         GDK_CURRENT_TIME);
+    }
   else if (tree_view->priv->in_column_resize)
     gtk_tree_view_button_release_column_resize (tree_view);
 }
@@ -9999,6 +10003,19 @@ _gtk_tree_view_column_start_drag (GtkTreeView       *tree_view,
 
   tree_view->priv->in_column_drag = TRUE;
 
+  /* Widget reparenting above unmaps and indirectly breaks
+   * the implicit grab, replace it with an active one.
+   */
+  gdk_device_grab (device,
+                   tree_view->priv->drag_window,
+                   GDK_OWNERSHIP_NONE,
+                   FALSE,
+                   GDK_TOUCH_MASK |
+                   GDK_POINTER_MOTION_MASK |
+                   GDK_BUTTON_RELEASE_MASK,
+                   NULL,
+                   GDK_CURRENT_TIME);
+
   gtk_gesture_set_state (tree_view->priv->column_drag_gesture,
                          GTK_EVENT_SEQUENCE_CLAIMED);
 }